package com.qf.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.HashMap;
import java.util.Map;

public class Jwtutils {

    //创建令牌---这个user接收的是实现层传过来的map  map中存放的是 map.put("xcUserid",xcUserReq.getId());
    public String createToken(Map user){
        //设置算法以及签名
        Algorithm algorithmHS = Algorithm.HMAC256("secret");
        //设置头部
        Map map = new HashMap();
        map.put("typ","JWT");
        map.put("alg","HS256");
        String token = JWT.create().withHeader(map)
                //签发人
                .withIssuer("auth0")
                //主题
                .withSubject("login")
                //受众
                .withAudience("users")
                //自定义载荷
                //key:就是userid value：从Map对象中获取的
                .withClaim("xcUserid",Integer.valueOf(user.get("xcUserid").toString()))
                .sign(algorithmHS);

        //生成string类型的token串返回
        return token;

    }

    //验证令牌--解析token--要返回一个对象 所以返回值类型是Map 用来存放用户信息
    public Map verfiyToken(String token){

        Map map=new HashMap();

        Algorithm algorithmHS = Algorithm.HMAC256("secret");
        JWTVerifier verifier = JWT.require(algorithmHS)
                .withIssuer("auth0")
                .build(); //Reusable verifier instance
        try{
            DecodedJWT jwt = verifier.verify(token);

            //如果验证成功的话
            map.put("status" ,true);

            //如果直接tostring的话则返回的是地址值(改)--返回int
            map.put("userid",jwt.getClaim("userid").asInt());

            return map;

        }catch (Exception e){

            //如果验证失败的话
            map.put("status" ,false);

            return map;

        }
    }
}
